/* 
基础数据类型
1. boolean
2. number
3. string
4. null和undefined
5. 数组
6. 元组(Tuple) 
7. 枚举(enum)
8. any
9. void
10. object
*/

(function () {
  // 1. boolean
  let isDone: boolean = false
  isDone = true
  // isDone = 'abc' // error  不能将类型“string”分配给类型“boolean”

  // 2. number
  let age: number = 12
  // age = true // error

  // 3. string
  let name: string = 'tom'
  name = `我叫${name}, 今年${age}`


  // 4. null和undefined
  let n: null = null
  // n = 'abc'  // error
  let u: undefined = undefined
  // u = 123 // error
  /* null和undefined是任意类型的子类型 */
  age = null
  age = undefined  

  // 5. 数组
  let arr: number[] = [1, 3, /* 'abc' */]
  let arr2: Array<string> = ['a', 'abc', /* true */]
  arr.push(4)
  // arr.push('abc') // error

  // 6. 元组(Tuple) 已知元素数量和类型的数组
  let t: [number, string]
  t = [123, 'abc']
  // t = [123, 234] // error


  // 7. 枚举(enum)
  /* const RED = 1
  const BLUE = 2
  const GREEN = 3
  let color = RED */
  enum Color { // 0 1 2
    Red,  
    Blue = 3,
    Green
  }
  console.log(Color)
  let myColor = Color.Red
  console.log(myColor, Color.Blue, Color[2])

  // 8. any
  let anyValue: any = 3
  anyValue = 'abc'
  let arr3: any[] = ['abc', 123, true]

  // 9. void   经常用于定义函数没有返回值
  function fn(): void {
    // return 'abc' // error
    // return undefined  // undefined是任意类型的子类型
  }
  // 10. object
  let obj: object = {}
  obj = []
  obj = () => {}
  // obj = 'abc' // error
  obj = new String('abc')
  obj = null
})()

/* 
强类型的好处:
  正确语法的提示补全
  错误语法的错误提示
*/